package com.estore.model;
import java.util.Objects;

/**
 * 商品实体类
 * 代表电子商务系统中的商品信息
 */
public class Product implements Comparable<Product> {
    private String id;      // 商品ID
    private String name;    // 商品名称
    private double price;   // 价格
    private int stock;      // 库存

    /**
     * 默认构造函数
     */
    public Product() {
    }

    /**
     * 全参构造函数
     * @param id 商品ID
     * @param name 商品名称
     * @param price 价格
     * @param stock 库存
     */
    public Product(String id, String name, double price, int stock) {
        setId(id);
        setName(name);
        setPrice(price);
        setStock(stock);
    }

    // Getters and Setters with validation
    public String getId() {
        return id;
    }

    public void setId(String id) {
        if (id == null || id.trim().isEmpty()) {
            throw new IllegalArgumentException("商品ID不能为空");
        }
        this.id = id.trim();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name == null || name.trim().isEmpty()) {
            throw new IllegalArgumentException("商品名称不能为空");
        }
        this.name = name.trim();
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        if (price < 0) {
            throw new IllegalArgumentException("价格不能为负数");
        }
        this.price = price;
    }

    public int getStock() {
        return stock;
    }

    public void setStock(int stock) {
        if (stock < 0) {
            throw new IllegalArgumentException("库存不能为负数");
        }
        this.stock = stock;
    }

    /**
     * 减少库存
     * @param quantity 减少的数量
     * @return 是否成功减少
     */
    public boolean decreaseStock(int quantity) {
        if (quantity <= 0) {
            throw new IllegalArgumentException("减少数量必须大于0");
        }
        if (quantity > stock) {
            return false;
        }
        this.stock -= quantity;
        return true;
    }

    /**
     * 增加库存
     * @param quantity 增加的数量
     * @return 当前库存数量
     */
    public int increaseStock(int quantity) {
        if (quantity <= 0) {
            throw new IllegalArgumentException("增加数量必须大于0");
        }
        this.stock += quantity;
        return this.stock;
    }

    /**
     * 检查是否有库存
     * @return 是否有库存
     */
    public boolean isInStock() {
        return stock > 0;
    }

    /**
     * 检查库存是否充足
     * @param quantity 需要检查的数量
     * @return 库存是否充足
     */
    public boolean isStockSufficient(int quantity) {
        return quantity > 0 && stock >= quantity;
    }

    /**
     * 获取商品信息摘要
     * @return 商品信息摘要
     */
    public String getSummary() {
        return String.format("%s (¥%.2f)", name, price);
    }

    @Override
    public String toString() {
        return String.format("ID: %-5s | 名称: %-20s | 价格: ¥%-8.2f | 库存: %d",
                id, name, price, stock);
    }

    /**
     * 生成详细信息的字符串
     * @return 详细信息
     */
    public String toDetailedString() {
        return String.format("商品详情:\n" +
                        "  ID: %s\n" +
                        "  名称: %s\n" +
                        "  价格: ¥%.2f\n" +
                        "  库存: %d\n" +
                        "  有库存: %s",
                id, name, price, stock, isInStock() ? "是" : "否");
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Product product = (Product) o;
        return Objects.equals(id, product.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    @Override
    public int compareTo(Product other) {
        if (other == null) {
            return 1;
        }
        return this.id.compareTo(other.id);
    }

    /**
     * 复制当前商品对象
     * @return 新的商品对象副本
     */
    public Product copy() {
        return new Product(this.id, this.name, this.price, this.stock);
    }

    /**
     * 创建商品构建器
     * @return 商品构建器
     */
    public static Builder builder() {
        return new Builder();
    }

    /**
     * 商品构建器类（建造者模式）
     */
    public static class Builder {
        private String id;
        private String name;
        private double price;
        private int stock;

        public Builder id(String id) {
            this.id = id;
            return this;
        }

        public Builder name(String name) {
            this.name = name;
            return this;
        }

        public Builder price(double price) {
            this.price = price;
            return this;
        }

        public Builder stock(int stock) {
            this.stock = stock;
            return this;
        }

        public Product build() {
            return new Product(id, name, price, stock);
        }
    }

    /**
     * 应用折扣
     * @param discountRate 折扣率 (0-1之间，如0.1表示9折)
     * @return 折扣后的价格
     */
    public double applyDiscount(double discountRate) {
        if (discountRate < 0 || discountRate > 1) {
            throw new IllegalArgumentException("折扣率必须在0-1之间");
        }
        double discountedPrice = this.price * (1 - discountRate);
        // 保留两位小数
        return Math.round(discountedPrice * 100.0) / 100.0;
    }

    /**
     * 更新商品信息
     * @param name 新名称（如果为null则不更新）
     * @param price 新价格（如果为负数则不更新）
     * @param stock 新库存（如果为负数则不更新）
     */
    public void update(String name, Double price, Integer stock) {
        if (name != null && !name.trim().isEmpty()) {
            setName(name);
        }
        if (price != null && price >= 0) {
            setPrice(price);
        }
        if (stock != null && stock >= 0) {
            setStock(stock);
        }
    }
}